package seed

import (
	"wms/config"
	"wms/internal/model"
	"wms/pkg/database"
	"wms/pkg/logger"

	"go.uber.org/zap"
)

// InitUsers 初始化所有用户数据
func InitUsers() error {
	logger.Info("开始初始化用户数据...")

	// 初始化管理员用户
	if err := InitAdmin(); err != nil {
		return err
	}

	// 初始化员工用户
	if err := InitStaff(); err != nil {
		return err
	}

	logger.Info("用户数据初始化完成")
	return nil
}

// InitAdmin 初始化管理员用户
func InitAdmin() error {
	logger.Info("开始初始化管理员用户...")
	db := database.GetDB()

	// 读取管理员配置
	adminConfig := config.GetConfig().Admin

	// 查找管理员角色
	var adminRole model.Role
	if err := db.Where("code = ?", "admin").First(&adminRole).Error; err != nil {
		logger.Error("获取管理员角色失败", zap.Error(err))
		return err
	}

	// 使用Count检查管理员用户是否存在，更可靠
	var count int64
	if err := db.Model(&model.User{}).Where("username = ?", adminConfig.Username).Count(&count).Error; err != nil {
		logger.Error("检查管理员是否存在时发生错误", zap.Error(err))
		return err
	}

	if count == 0 {
		// 创建管理员用户
		admin := &model.User{
			Username: adminConfig.Username,
			Password: adminConfig.Password, // 使用原始密码，会在BeforeCreate钩子中自动哈希
			Nickname: "管理员",
			Status:   1,
			RoleID:   adminRole.ID,
			Email:    "admin@example.com", // 添加默认邮箱
			Phone:    "12345678900",       // 添加默认手机号
		}
		if err := db.Create(admin).Error; err != nil {
			logger.Error("创建管理员用户失败", zap.Error(err))
			return err
		}
		logger.Info("管理员用户创建成功", zap.String("username", adminConfig.Username))
	} else {
		logger.Info("管理员账号已存在", zap.String("username", adminConfig.Username))
	}

	return nil
}

// InitStaff 初始化员工用户
func InitStaff() error {
	logger.Info("开始初始化员工用户...")
	db := database.GetDB()

	// 查找员工角色
	var staffRole model.Role
	if err := db.Where("code = ?", "staff").First(&staffRole).Error; err != nil {
		logger.Error("获取员工角色失败", zap.Error(err))
		return err
	}

	// 要创建的员工账号列表
	staffAccounts := []struct {
		Username string
		Password string
		Nickname string
		Phone    string // 添加手机号字段
	}{
		{
			Username: "staff1",
			Password: "123456",
			Nickname: "员工一",
			Phone:    "13800138001", // 为每个员工指定不同手机号
		},
		{
			Username: "staff2",
			Password: "123456",
			Nickname: "员工二",
			Phone:    "13800138002",
		},
	}

	// 循环创建多个员工账号
	for _, account := range staffAccounts {
		// 使用Count检查员工用户是否存在，更可靠
		var count int64
		if err := db.Model(&model.User{}).Where("username = ?", account.Username).Count(&count).Error; err != nil {
			logger.Error("检查用户是否存在时发生错误", zap.Error(err), zap.String("username", account.Username))
			continue // 跳过这个用户，继续处理下一个
		}

		if count == 0 {
			// 用户不存在，创建新用户
			newUser := &model.User{
				Username: account.Username,
				Password: account.Password, // 使用原始密码，会在BeforeCreate钩子中自动哈希
				Nickname: account.Nickname,
				Status:   1,
				RoleID:   staffRole.ID,
				Email:    account.Username + "@example.com", // 添加默认邮箱
				Phone:    account.Phone,                     // 使用指定的手机号
			}
			if err := db.Create(newUser).Error; err != nil {
				logger.Error("创建员工用户失败", zap.Error(err), zap.String("username", account.Username))
				// 不返回错误，继续创建其他用户
				continue
			}
			logger.Info("员工用户创建成功", zap.String("username", account.Username))
		} else {
			logger.Info("员工账号已存在", zap.String("username", account.Username))
		}
	}

	logger.Info("员工用户初始化完成")
	return nil
}
